import { db } from '../src/models';
import { Character, User, ChatMessage, UserCharacterRelation } from '../src/models';
import { logger } from '../src/utils/logger';

/**
 * 示例数据插入脚本
 */
async function seedData() {
  try {
    logger.info('开始插入示例数据...');
    
    // 插入示例角色
    const characters = [
      {
        name: '艾莉娅',
        description: '一位来自异世界的魔法少女，拥有强大的治愈能力，性格温柔善良，总是乐于助人。',
        avatar_url: 'https://example.com/avatars/alia.jpg',
        personality: '温柔、善良、乐于助人、有耐心',
        background: '来自魔法世界的治愈师，在一次意外中来到了人类世界，对人类文化充满好奇。',
        greeting_message: '你好！我是艾莉娅，很高兴认识你。有什么我可以帮助你的吗？',
        is_active: true,
        created_at: new Date(),
        updated_at: new Date()
      },
      {
        name: '雷克斯',
        description: '一位勇敢的骑士，忠诚而坚定，为了保护弱者而战。',
        avatar_url: 'https://example.com/avatars/rex.jpg',
        personality: '勇敢、忠诚、坚定、有正义感',
        background: '来自王国的骑士团，因任务来到这个城市，对现代科技感到新奇。',
        greeting_message: '我是雷克斯，一名骑士。如果你需要帮助，随时可以找我。',
        is_active: true,
        created_at: new Date(),
        updated_at: new Date()
      },
      {
        name: '露娜',
        description: '一位神秘的占卜师，能够预见未来，但总是说话含糊不清。',
        avatar_url: 'https://example.com/avatars/luna.jpg',
        personality: '神秘、智慧、冷静、有时难以理解',
        background: '从小就能看到未来的片段，因此被周围的人视为异类，后来成为了一名占卜师。',
        greeting_message: '命运的丝线将我们联系在一起...你有什么想了解的吗？',
        is_active: true,
        created_at: new Date(),
        updated_at: new Date()
      },
      {
        name: '凯文',
        description: '一位天才科学家，对未知充满好奇，总是沉迷于各种实验。',
        avatar_url: 'https://example.com/avatars/kevin.jpg',
        personality: '聪明、好奇、专注、有时会忽略周围',
        background: '从小就对科学充满热情，在多个领域都有杰出贡献，目前正在研究跨维度旅行。',
        greeting_message: '哦！你好！我正在做一个有趣的实验，你愿意参与吗？',
        is_active: true,
        created_at: new Date(),
        updated_at: new Date()
      },
      {
        name: '小樱',
        description: '一位活泼可爱的少女，喜欢美食和冒险，总是充满活力。',
        avatar_url: 'https://example.com/avatars/sakura.jpg',
        personality: '活泼、开朗、乐观、有点贪吃',
        background: '普通的高中生，但意外获得了与异世界角色交流的能力，从此开始了奇妙的冒险。',
        greeting_message: '你好呀！我是小樱！要不要一起去寻找美食？',
        is_active: true,
        created_at: new Date(),
        updated_at: new Date()
      }
    ];
    
    logger.info('插入示例角色...');
    const insertedCharacters = await Character.createMany(characters);
    logger.info(`成功插入 ${insertedCharacters.length} 个角色`);
    
    // 插入示例用户
    const users = [
      {
        openid: 'test_user_001',
        nickname: '测试用户1',
        avatar_url: 'https://example.com/avatars/user1.jpg',
        is_active: true,
        created_at: new Date(),
        updated_at: new Date()
      },
      {
        openid: 'test_user_002',
        nickname: '测试用户2',
        avatar_url: 'https://example.com/avatars/user2.jpg',
        is_active: true,
        created_at: new Date(),
        updated_at: new Date()
      },
      {
        openid: 'test_user_003',
        nickname: '测试用户3',
        avatar_url: 'https://example.com/avatars/user3.jpg',
        is_active: true,
        created_at: new Date(),
        updated_at: new Date()
      }
    ];
    
    logger.info('插入示例用户...');
    const insertedUsers = await User.createMany(users);
    logger.info(`成功插入 ${insertedUsers.length} 个用户`);
    
    // 插入示例聊天消息
    const chatMessages = [];
    
    // 为每个用户和角色创建一些示例对话
    for (let i = 0; i < Math.min(insertedUsers.length, insertedCharacters.length); i++) {
      const user = insertedUsers[i];
      const character = insertedCharacters[i];
      
      // 用户发送消息
      chatMessages.push({
        user_id: user.id,
        character_id: character.id,
        sender_type: 'user',
        content: `你好，${character.name}！`,
        created_at: new Date(Date.now() - 3600000), // 1小时前
        updated_at: new Date(Date.now() - 3600000)
      });
      
      // 角色回复
      chatMessages.push({
        user_id: user.id,
        character_id: character.id,
        sender_type: 'character',
        content: character.greeting_message,
        created_at: new Date(Date.now() - 3500000), // 59分钟前
        updated_at: new Date(Date.now() - 3500000)
      });
      
      // 用户再次发送消息
      chatMessages.push({
        user_id: user.id,
        character_id: character.id,
        sender_type: 'user',
        content: '很高兴认识你！',
        created_at: new Date(Date.now() - 1800000), // 30分钟前
        updated_at: new Date(Date.now() - 1800000)
      });
      
      // 角色再次回复
      chatMessages.push({
        user_id: user.id,
        character_id: character.id,
        sender_type: 'character',
        content: '我也是！有什么想聊的吗？',
        created_at: new Date(Date.now() - 1700000), // 28分钟前
        updated_at: new Date(Date.now() - 1700000)
      });
    }
    
    logger.info('插入示例聊天消息...');
    const insertedMessages = await ChatMessage.createMany(chatMessages);
    logger.info(`成功插入 ${insertedMessages.length} 条聊天消息`);
    
    // 插入用户与角色的关系
    const userCharacterRelations = [];
    
    // 为每个用户和角色创建关系
    for (const user of insertedUsers) {
      for (const character of insertedCharacters) {
        // 随机收藏级别 (1-5)
        const favoriteLevel = Math.floor(Math.random() * 5) + 1;
        
        userCharacterRelations.push({
          user_id: user.id,
          character_id: character.id,
          favorite_level: favoriteLevel,
          last_interaction_at: new Date(Date.now() - Math.random() * 86400000 * 7), // 最近7天内随机时间
          created_at: new Date(Date.now() - Math.random() * 86400000 * 30), // 最近30天内随机创建时间
          updated_at: new Date()
        });
      }
    }
    
    logger.info('插入用户与角色关系...');
    const insertedRelations = await UserCharacterRelation.createMany(userCharacterRelations);
    logger.info(`成功插入 ${insertedRelations.length} 条用户与角色关系`);
    
    logger.info('示例数据插入完成！');
    
    // 输出统计信息
    const stats = {
      characters: insertedCharacters.length,
      users: insertedUsers.length,
      messages: insertedMessages.length,
      relations: insertedRelations.length
    };
    
    logger.info('数据统计:', stats);
    
    return stats;
  } catch (error) {
    logger.error('插入示例数据失败:', error);
    throw error;
  }
}

/**
 * 清空所有表数据
 */
async function clearData() {
  try {
    logger.info('开始清空数据...');
    
    // 按照外键依赖顺序删除数据
    await db.query('DELETE FROM user_character_relation');
    await db.query('DELETE FROM chat_message');
    await db.query('DELETE FROM user');
    await db.query('DELETE FROM ai_character');
    
    logger.info('数据清空完成！');
  } catch (error) {
    logger.error('清空数据失败:', error);
    throw error;
  }
}

/**
 * 主函数
 */
async function main() {
  const command = process.argv[2];
  
  try {
    // 初始化数据库连接
    await db.query('SELECT 1');
    logger.info('数据库连接成功');
    
    if (command === 'clear') {
      await clearData();
    } else if (command === 'seed') {
      await seedData();
    } else if (command === 'reset') {
      await clearData();
      await seedData();
    } else {
      logger.info('可用命令: clear, seed, reset');
      logger.info('clear: 清空所有数据');
      logger.info('seed: 插入示例数据');
      logger.info('reset: 清空数据并插入示例数据');
    }
  } catch (error) {
    logger.error('执行失败:', error);
    process.exit(1);
  } finally {
    // 关闭数据库连接
    await db.end();
    logger.info('数据库连接已关闭');
  }
}

// 如果直接运行此脚本，则执行主函数
if (require.main === module) {
  main();
}

export { seedData, clearData };